// 基于axios封装网络请求
import theAxios from 'axios'
import router from '@/router'
import Notify from '@/ui/Notify.js'
import { getToken, removeToken } from '../utils/token.js'
// import { getNewTokenAPI } from '@/api'

const axios = theAxios.create({
    baseURL: 'http://geek.itheima.net',
    timeout: 20000 // 20秒超时时间（请求20秒无响应直接判定超时）
})

// 添加请求拦截器
axios.interceptors.request.use(
    function(config) {
//         // http响应状态码为2xx，3xx进入这里
//         // 在请求之前做什么
//         // ?.可选链操作符，如果前面对象里没有length,整个表达式原地返回undefined
        if (getToken()?.length > 0 && config.headers.Authorization === undefined) {
            config.headers.Authorization = `Bearer ${getToken()}`
// axios.interceptors.request.use(
//     function(config) {
//         let res = getToken()
//         if (res && res.length > 0 && config.headers.Authorization === undefined) {
// //             config.headers.Authorization = `Bearer ${res}`
        }
        return config
    },
    function(error) {
        // http响应状态码为4xx，5xx进入这里
        // 对请求错误做什么
        return Promise.reject(error)
    }
)

// 添加响应拦截器
axios.interceptors.response.use(
    function(response) {
        // 对响应数据做些什么
        return response
    },
    async function(error) {
        // 对响应错误做什么
        console.dir(error)
        if (error.response.status === 401) {
            Notify({ type: 'warning', message: '身份已过期' })

            removeToken() //先清除token，才能让路由守卫判断失效
                // 方式一：强制跳转到登录每用户有感知
                //router.currenyRoute相当于在vue文件内this。￥router-》当前路由对象信息
                //fullPath，路由对象里完整路径#后面的一切
            router.replace(`/login?path=${router.currentRoute.fullPath}`)
        }
        // 方式二：使用refresh_token换回系你的token再继续使用
        //     const res = await getNewTokenAPI()

        //     //更新token到本地
        //     setToken(res.data.data.token)
        //         //更新新的token在请求头里
        //     error.config.headers.Authorization = `Bearer ${res.data.data.token}`
        //         //未完成这次请求，再一次发起
        //         //error.config就是上一次请求的配置对象
        //         //结果我们要return回原来逻辑页面调用地方
        //     return axios(error.config)
        // } else if (error.response.status === 500 && error.config.url === '/v1_0/authorizations' && error.config.method === 'put') {
        //     //刷新的refresh_token也过期了
        //     localStorage.clear() //清除localstorage的值
        //     Notify({ type: 'warning', message: '身份已过期' })
        //     router.replace('/login')
        // }
        return Promise.reject(error)
    }
)

export default ({ url, method = 'GET', params = {}, data = {}, headers = {} }) => {
    return axios({
        url,
        method,
        params,
        data,
        headers
    })
}